package com.agile.leetcode.middle.sumFourDivisors;

import java.util.HashSet;
import java.util.Set;

/**
 * 1390. 四因数
 * 给你一个整数数组 nums，请你返回该数组中恰有四个因数的这些整数的各因数之和。
 * <p>
 * 如果数组中不存在满足题意的整数，则返回 0 。
 * <p>
 * <p>
 * <p>
 * 示例：
 * <p>
 * 输入：nums = [21,4,7]
 * 输出：32
 * 解释：
 * 21 有 4 个因数：1, 3, 7, 21
 * 4 有 3 个因数：1, 2, 4
 * 7 有 2 个因数：1, 7
 * 答案仅为 21 的所有因数的和。
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/4 17:10
 */
public class SumFourDivisors {
    public static void main(String[] args) {
        SumFourDivisors sumFourDivisors = new SumFourDivisors();
        int[] nums = {21, 4, 7};
        int i = sumFourDivisors.sumFourDivisors(nums);
        System.out.println(i);
    }

    public int sumFourDivisors(int[] nums) {
        // 定义接收结果
        int result = 0;
        // 遍历
        for (int num : nums) {
            int sum = getSum(num);
            result += sum;
        }
        return result;
    }

    public int getSum(int nums) {
        // 创建去重集合，存储
        Set<Integer> set = new HashSet<>(10);
        // i*i小于等于nums是解答的关键
        for (int i = 1; i * i < nums; i++) {
            // 拿到余数
            int mod = nums % i;
            if (mod == 0) {
                // 能相除
                int result = nums / i;
                // 加入集合
                set.add(i);
                set.add(result);
                // 判断set长度
                if (set.size() > 4) {
                    return 0;
                }
            }
        }
        if (set.size() < 4) {
            return 0;
        } else {
            int sum = 0;
            for (Integer integer : set) {
                sum += integer;
            }
            return sum;
        }
    }
}
